/******************************************************************************
 * Product: Adempiere ERP & CRM Smart Business Solution                       *
 * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved.                *
 * This program is free software; you can redistribute it and/or modify it    *
 * under the terms version 2 of the GNU General Public License as published   *
 * by the Free Software Foundation. This program is distributed in the hope   *
 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.           *
 * See the GNU General Public License for more details.                       *
 * You should have received a copy of the GNU General Public License along    *
 * with this program; if not, write to the Free Software Foundation, Inc.,    *
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
 * For the text or an alternative of this public license, you may reach us    *
 * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA        *
 * or via info@compiere.org or http://www.compiere.org/license.html           *
 *****************************************************************************/
package org.compiere.acct;

import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;

import org.compiere.model.MAccount;
import org.compiere.model.MAcctSchema;
import org.compiere.model.MBankAccount;
import org.compiere.model.MCharge;
import org.compiere.model.MDocType;
import org.compiere.model.MPayment;
import org.compiere.model.MFI_C_PaymentLine;
import org.compiere.model.Mhrmlimitholiday;
import org.compiere.model.Mhrmstatement;
import org.compiere.model.Mhrmvacationline;
import org.compiere.model.X_hrm_statement;
import org.compiere.util.DB;
import org.compiere.util.Env;

/**
 * Post Invoice Documents.
 * 
 * <pre>
 *  Table:              C_Payment (335)
 *  Document Types      ARP, APP
 * </pre>
 * 
 * @author Jorg Janke
 * @version $Id: Doc_Payment.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
 */
public class Doc_Payment extends Doc {
	/**
	 * Constructor
	 * 
	 * @param ass
	 *            accounting schemata
	 * @param rs
	 *            record
	 * @param trxName
	 *            trx
	 */
	public Doc_Payment(MAcctSchema[] ass, ResultSet rs, String trxName) {
		super(ass, MPayment.class, rs, null, trxName);
	} // Doc_Payment

	/** Tender Type */
	private String m_TenderType = null;
	/** Prepayment */
	private boolean m_Prepayment = false;
	/** Bank Account */
	private int m_C_BankAccount_ID = 0;

	/**
	 * Load Specific Document Details
	 * 
	 * @return error message or null
	 */
	protected String loadDocumentDetails() {
		MPayment pay = (MPayment) getPO();
		setDateDoc(pay.getDateTrx());
		m_TenderType = pay.getTenderType();
		m_Prepayment = pay.isPrepayment();
		m_C_BankAccount_ID = pay.getC_BankAccount_ID();
		// Amount
		setAmount(Doc.AMTTYPE_Gross, pay.getPayAmt());
		return null;
	} // loadDocumentDetails

	
	
	
	/**************************************************************************
	 * Get Source Currency Balance - always zero
	 * 
	 * @return Zero (always balanced)
	 */
	public BigDecimal getBalance() {
		BigDecimal retValue = Env.ZERO;
		// log.config( toString() + " Balance=" + retValue);
		return retValue;
	} // getBalance

	/**
	 * Create Facts (the accounting logic) for ARP, APP.
	 * 
	 * <pre>
	 *  ARP
	 *      BankInTransit   DR
	 *      UnallocatedCash         CR
	 *      or Charge/C_Prepayment
	 *  APP
	 *      PaymentSelect   DR
	 *      or Charge/V_Prepayment
	 *      BankInTransit           CR
	 *  CashBankTransfer
	 *      -
	 * </pre>
	 * 
	 * @param as
	 *            accounting schema
	 * @return Fact
	 */
	public ArrayList<Fact> createFacts(MAcctSchema as) {

		// V.Sokolov
		int m_GL_Category_ID = 0;
		String sql_ = "SELECT GL_Category_ID FROM C_DocType WHERE C_DocType_ID=?";
		PreparedStatement pstmt = null;
		ResultSet rsDT = null;
		try {
			pstmt = DB.prepareStatement(sql_, null);
			pstmt.setInt(1, getC_DocType_ID());
			rsDT = pstmt.executeQuery();
			if (rsDT.next()) {
				m_GL_Category_ID = rsDT.getInt(1);
			}
		} catch (SQLException e) {
			log.log(Level.SEVERE, sql_, e);
		} finally {
			DB.close(rsDT, pstmt);
			rsDT = null;
			pstmt = null;
		}

		// not to create entries V.Sokolov
		ArrayList<Fact> facts_ = new ArrayList<Fact>();
		if (m_GL_Category_ID == 0 || m_GL_Category_ID == 1000001)
			return facts_;

		// create Fact Header
		Fact fact = new Fact(this, as, Fact.POST_Actual);
		MAccount acct = null;
		// Cash Transfer
		if ("X".equals(m_TenderType)) {
			ArrayList<Fact> facts = new ArrayList<Fact>();
			facts.add(fact);
			return facts;
		}

		// divide by type of docs
		// -------------------------------------------------------------------
		int id2 = get_ID();
		MPayment payment = new MPayment(Env.getCtx(), get_ID(), null);

		String DocumentType = getDocumentType();
		String DocStatus = payment.getDocStatus() == null ? "" : payment.getDocStatus();
	
		
		// new logic ---------------------------------------------------
		System.out.println();
		System.out.println();
		System.out.println("--------------------- new creat facts ----------------");
		MDocType docType = null;
		String DocBaseType = "";
		
		DocBaseType = payment.getC_DocType().getDocBaseType();
		DocStatus = payment.getDocStatus();
//		int C_DocType_ID = Env.getContextAsInt (ctx, WindowNo, "C_DocType_ID");
//		if(C_DocType_ID > 0)
//			docType = MDocType.get (ctx, C_DocType_ID);
		
//		DocBaseType = docType.getDocBaseType();
		Properties ctx = Env.getCtx();
		System.out.println("DocType: " + DocBaseType);
		
		int Account_1030 = payment.get_ValueAsInt("Account_1030");
		int Account_Primary = payment.get_ValueAsInt("C_ValidCombination_ID");
		int Account_Secondary = payment.get_ValueAsInt("Account_Secondary");
		
		
		FactLine fl = null;

		if(Account_Primary == 0 || Account_1030 == 0){
			p_Error = "Отсутствует коррекспондирующий счет";
			log.log(Level.SEVERE, p_Error);
			fact = null;
		}
		
		
//1		// исходящее плат. поручение
		if(DocBaseType.equals("APP")){
			
			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
			
			if (list == null || list.size() == 0) {
				
					BigDecimal amount = payment.getPayAmt();
		//			if(DocStatus.equals("RE")) 
		//				amount = amount.negate();
					
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
					
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);			
					
//				p_Error = "Позиции документа пусты, необходимо внести запись/и";
//				log.log(Level.SEVERE, p_Error);
//				fact = null;
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();

					if(DocStatus.equals("RE")) 
						amount = amount.negate();
					
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
					
//					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);			
					
//					acct = MAccount.get (as.getCtx(), Account_1030);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	amount);
		
				}
			}
			
		}//1
		
//2		//	входящее плат. поручение
		else if(DocBaseType.equals("ARR")){
			
			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
			
			if (list == null || list.size() == 0) {
					BigDecimal amount = payment.getPayAmt();
		//			if(DocStatus.equals("RE")) 
		//				amount = amount.negate();
					
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
					
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);			
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();

					if(DocStatus.equals("RE")) 
						amount = amount.negate();
					
					setC_BPartner_ID(bp);
//					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
		
					
					setC_BPartner_ID(bp);
//					acct = MAccount.get (as.getCtx(), Account_1030);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	amount);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);			
		
				}
			}			
			
		}//2
		
//3		//	исходящее плат. поручение (заработная плата)
		else if(DocBaseType.equals("APS")){

			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
		
			if (list == null || list.size() == 0) {
				p_Error = "Позиции документа пусты, необходимо внести запись/и";
				log.log(Level.SEVERE, p_Error);
				fact = null;
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();

					if(DocStatus.equals("RE")) 
						amount = amount.negate();
					
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	amount);
		
				}
			}
		}//3
		
//4		//	входящее плат. поручение (заработная плата)
		else if(DocBaseType.equals("ARS")){

			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
			
			if (list == null || list.size() == 0) {
				p_Error = "Позиции документа пусты, необходимо внести запись/и";
				log.log(Level.SEVERE, p_Error);
				fact = null;
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();
					
					if(DocStatus.equals("RE")) 
						amount = amount.negate();
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
					
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
				}
			}
			
		}//4		

//5		//	исходящее плат. поручение (подотчет)
		else if(DocBaseType.equals("APA")){

			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
			
			if (list == null || list.size() == 0) {
				p_Error = "Позиции документа пусты, необходимо внести запись/и";
				log.log(Level.SEVERE, p_Error);
				fact = null;
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();

					if(DocStatus.equals("RE")) 
						amount = amount.negate();
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	amount);
		
				}
			}
		}//5
		
//6		//	входящее плат. поручение (подотчет)
		else if(DocBaseType.equals("ARA")){

			List<MFI_C_PaymentLine> list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
			
			if (list == null || list.size() == 0) {
				p_Error = "Позиции документа пусты, необходимо внести запись/и";
				log.log(Level.SEVERE, p_Error);
				fact = null;
		
			} else {
				// Integer BPHeader = getC_BPartner_ID();
				for (int i = 0; i < list.size(); i++) {
					Integer bp = list.get(i).getC_BPartner_ID();
					BigDecimal amount = list.get(i).getAmount();

					if(DocStatus.equals("RE")) 
						amount = amount.negate();
		
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), amount, null);
					
					setC_BPartner_ID(bp);
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null, amount);
				}
			}
		}//6
		
//7		//	исходящее плат. поручение (комиссия банка)
		else if(DocBaseType.equals("APB")){
			if(payment.getC_Charge_ID() != 0 && payment.getPayAmt().compareTo(Env.ZERO) != 0){
				
				int cmp = payment.getPayAmt().compareTo(Env.ZERO);
				if (cmp < 0){
					
					BigDecimal amount = payment.getPayAmt();					
//					if(DocStatus.equals("RE")) 
//						amount = amount.negate();
					
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	payment.getPayAmt());
					
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), payment.getPayAmt(), null);
				}else if(cmp > 0){
					
					BigDecimal amount = payment.getPayAmt();					
//					if(DocStatus.equals("RE")) 
//						amount = amount.negate();
					
					acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
					fl = fact.createLine(null, acct, getC_Currency_ID(), payment.getPayAmt(), null);
		
					acct = MAccount.get (as.getCtx(), Account_1030);
					fl = fact.createLine(null, acct, getC_Currency_ID(), null,	payment.getPayAmt());
				}

			}else{
				
				BigDecimal amount = payment.getPayAmt();					
				if(DocStatus.equals("RE")) 
					amount = amount.negate();
				
				acct = MAccount.get (as.getCtx(), Account_Secondary == 0 ? Account_Primary : Account_Secondary);
				fl = fact.createLine(null, acct, getC_Currency_ID(), payment.getPayAmt(), null);
	
				acct = MAccount.get (as.getCtx(), Account_1030);
				fl = fact.createLine(null, acct, getC_Currency_ID(), null,	payment.getPayAmt());
			
			}
			
		}//6				
		
		//end new logic-------------------------------------------------
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
//		if (DocumentType.equals("APS")) {//------------------------------------
//
//			// ДЛЯ ЗП НЕОБХОДИМЫ ПОЗИЦИИ (ЛЮДИ)
//			// НЕ СТОРНО
//			if (!DocStatus.equals("RE")) {
//				List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//						.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//
//				if (list == null || list.size() == 0) {
//					p_Error = "Позиции документа пусты, необходимо внести запись/и";
//					log.log(Level.SEVERE, p_Error);
//					fact = null;
//
//				} else {
//					// Integer BPHeader = getC_BPartner_ID();
//					for (int i = 0; i < list.size(); i++) {
//						Integer bp = list.get(i).getC_BPartner_ID();
//						BigDecimal amount = list.get(i).getAmount();
//
//						FactLine fl = null;
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMSalary, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								amount, null);
//
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								null, amount);
//
//					}
//				}
//
//			} else { // СТОРНО
//
//				// УДАЛИМ ПОЗИЦИИ (ЕСЛИ ОНИ БЫЛИ) И СКОПИРУЕМ С ПЕРВИЧНОГО
//				// ДОКУМЕНТА, Т.Е. КОТОРЫЙ БЫЛ СТОРНИРОВАН (ПОЛОЖИМ ЗП С 
//				// МИНУСОМ ТЕМ САМЫМ ВЫРАВНИВ САЛЬДО)
//				
//				List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//						.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//				if (list != null) {
//					for (int i = 0; i < list.size(); i++) {
//						MFI_C_PaymentLine l = list.get(i);
//						l.deleteEx(true);
//
//					}
//				}
//
//				// КОПИРУЕМ С ПЕРВИЧНОГО ДОКУМЕНТА
//
//				list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//						payment.getReversal_ID());
//				for (int i = 0; i < list.size(); i++) {
//					MFI_C_PaymentLine l = list.get(i);
//					MFI_C_PaymentLine line = new MFI_C_PaymentLine(getCtx(), 0,
//							null);
//					line.setC_Payment_ID(payment.get_ID());
//					line.setC_BPartner_ID(l.getC_BPartner_ID());
//					line.setAmount(l.getAmount());
//					line.save();
//				}
//
//				list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//						payment.get_ID());
//
//				// ПРОВОДИМ
//
//				for (int i = 0; i < list.size(); i++) {
//					Integer bp = list.get(i).getC_BPartner_ID();
//					BigDecimal amount = list.get(i).getAmount().negate();
//
//					FactLine fl = null;
//					setC_BPartner_ID(bp);
//					acct = getAccount(Doc.ACCTTYPE_HRMSalary, as);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), 
//							amount, null);
//
//					setC_BPartner_ID(bp);
//					acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//					fl = fact.createLine(null, acct, getC_Currency_ID(),
//							null, amount);
//
//				}
//
//			}
//
//		} else if (DocumentType.equals("ARS")) {	//--------------------------
//			
//
//			// ДЛЯ ЗП НЕОБХОДИМЫ ПОЗИЦИИ (ЛЮДИ)
//			// НЕ СТОРНО
//			if (!DocStatus.equals("RE")) {
//				List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//						.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//
//				if (list == null || list.size() == 0) {
//					p_Error = "Позиции документа пусты, необходимо внести запись/и";
//					log.log(Level.SEVERE, p_Error);
//					fact = null;
//
//				} else {
//					// Integer BPHeader = getC_BPartner_ID();
//					for (int i = 0; i < list.size(); i++) {
//						Integer bp = list.get(i).getC_BPartner_ID();
//						BigDecimal amount = list.get(i).getAmount();
//
//						FactLine fl = null;
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								amount, null);
//
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMSalary, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								null,	amount);
//
//					}
//				}
//
//			} else { // /СТОРНО
//
//				// УДАЛИМ ПОЗИЦИИ (ЕСЛИ ОНИ БЫЛИ) И СКОПИРУЕМ С ПЕРВИЧНОГО
//				// ДОКУМЕНТА,
//				// Т.Е. КОТОРЫЙ БЫЛ СТОРНИРОВАН (ПОЛОЖИМ ЗП С МИНУСОМ ТЕМ САМЫМ
//				// ВЫРАВНИВ САЛЬДО)
//				List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//						.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//				if (list != null) {
//					for (int i = 0; i < list.size(); i++) {
//						MFI_C_PaymentLine l = list.get(i);
//						l.deleteEx(true);
//
//					}
//				}
//
//				// КОПИРУЕМ С ПЕРВИЧНОГО ДОКУМЕНТА
//
//				list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//						payment.getReversal_ID());
//				for (int i = 0; i < list.size(); i++) {
//					MFI_C_PaymentLine l = list.get(i);
//					MFI_C_PaymentLine line = new MFI_C_PaymentLine(getCtx(), 0,
//							null);
//					line.setC_Payment_ID(payment.get_ID());
//					line.setC_BPartner_ID(l.getC_BPartner_ID());
//					line.setAmount(l.getAmount());
//					line.save();
//				}
//
//				list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//						payment.get_ID());
//
//				// ПРОВОДИМ
//
//				for (int i = 0; i < list.size(); i++) {
//					Integer bp = list.get(i).getC_BPartner_ID();
//					BigDecimal amount = list.get(i).getAmount().negate();
//
//					FactLine fl = null;
//					setC_BPartner_ID(bp);
//					acct = getAccount(Doc.ACCTTYPE_HRMSalary, as);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), null,
//							amount);
//
//					setC_BPartner_ID(bp);
//					acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//					fl = fact.createLine(null, acct, getC_Currency_ID(),
//							amount, null);
//
//				}
//
//			}
//			}else if (DocumentType.equals("APA")) {//------------------------------------
//
//				// ДЛЯ ЗП НЕОБХОДИМЫ ПОЗИЦИИ (ЛЮДИ)
//				// НЕ СТОРНО
//				if (!DocStatus.equals("RE")) {
//					List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//							.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//
//					if (list == null || list.size() == 0) {
//						p_Error = "Позиции документа пусты, необходимо внести запись/и";
//						log.log(Level.SEVERE, p_Error);
//						fact = null;
//
//					} else {
//						// Integer BPHeader = getC_BPartner_ID();
//						for (int i = 0; i < list.size(); i++) {
//							Integer bp = list.get(i).getC_BPartner_ID();
//							BigDecimal amount = list.get(i).getAmount();
//
//							FactLine fl = null;
//							setC_BPartner_ID(bp);
//							acct = getAccount(Doc.ACCTTYPE_InterCheckOff, as);
//							fl = fact.createLine(null, acct, getC_Currency_ID(),
//									amount, null);
//
//							setC_BPartner_ID(bp);
//							acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//							fl = fact.createLine(null, acct, getC_Currency_ID(),
//									null, amount);
//
//						}
//					}
//
//				} else { // СТОРНО
//
//					// УДАЛИМ ПОЗИЦИИ (ЕСЛИ ОНИ БЫЛИ) И СКОПИРУЕМ С ПЕРВИЧНОГО
//					// ДОКУМЕНТА, Т.Е. КОТОРЫЙ БЫЛ СТОРНИРОВАН (ПОЛОЖИМ ЗП С 
//					// МИНУСОМ ТЕМ САМЫМ ВЫРАВНИВ САЛЬДО)
//					
//					List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//							.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//					if (list != null) {
//						for (int i = 0; i < list.size(); i++) {
//							MFI_C_PaymentLine l = list.get(i);
//							l.deleteEx(true);
//
//						}
//					}
//
//					// КОПИРУЕМ С ПЕРВИЧНОГО ДОКУМЕНТА
//
//					list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//							payment.getReversal_ID());
//					for (int i = 0; i < list.size(); i++) {
//						MFI_C_PaymentLine l = list.get(i);
//						MFI_C_PaymentLine line = new MFI_C_PaymentLine(getCtx(), 0,
//								null);
//						line.setC_Payment_ID(payment.get_ID());
//						line.setC_BPartner_ID(l.getC_BPartner_ID());
//						line.setAmount(l.getAmount());
//						line.save();
//					}
//
//					list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//							payment.get_ID());
//
//					// ПРОВОДИМ
//
//					for (int i = 0; i < list.size(); i++) {
//						Integer bp = list.get(i).getC_BPartner_ID();
//						BigDecimal amount = list.get(i).getAmount().negate();
//
//						FactLine fl = null;
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_InterCheckOff, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(), 
//								amount, null);
//
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								null, amount);
//
//					}
//
//				}
//
//						
//			} else if (DocumentType.equals("ARA")) {	//--------------------------
//				
//
//				// ДЛЯ ЗП НЕОБХОДИМЫ ПОЗИЦИИ (ЛЮДИ)
//				// НЕ СТОРНО
//				if (!DocStatus.equals("RE")) {
//					List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//							.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//
//					if (list == null || list.size() == 0) {
//						p_Error = "Позиции документа пусты, необходимо внести запись/и";
//						log.log(Level.SEVERE, p_Error);
//						fact = null;
//
//					} else {
//						// Integer BPHeader = getC_BPartner_ID();
//						for (int i = 0; i < list.size(); i++) {
//							Integer bp = list.get(i).getC_BPartner_ID();
//							BigDecimal amount = list.get(i).getAmount();
//
//							FactLine fl = null;
//							setC_BPartner_ID(bp);
//							acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//							fl = fact.createLine(null, acct, getC_Currency_ID(),
//									amount, null);
//
//							setC_BPartner_ID(bp);
//							acct = getAccount(Doc.ACCTTYPE_InterCheckOff, as);
//							fl = fact.createLine(null, acct, getC_Currency_ID(),
//									null,	amount);
//
//						}
//					}
//
//				} else { // /СТОРНО
//
//					// УДАЛИМ ПОЗИЦИИ (ЕСЛИ ОНИ БЫЛИ) И СКОПИРУЕМ С ПЕРВИЧНОГО
//					// ДОКУМЕНТА,
//					// Т.Е. КОТОРЫЙ БЫЛ СТОРНИРОВАН (ПОЛОЖИМ ЗП С МИНУСОМ ТЕМ САМЫМ
//					// ВЫРАВНИВ САЛЬДО)
//					List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//							.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//					if (list != null) {
//						for (int i = 0; i < list.size(); i++) {
//							MFI_C_PaymentLine l = list.get(i);
//							l.deleteEx(true);
//
//						}
//					}
//
//					// КОПИРУЕМ С ПЕРВИЧНОГО ДОКУМЕНТА
//
//					list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//							payment.getReversal_ID());
//					for (int i = 0; i < list.size(); i++) {
//						MFI_C_PaymentLine l = list.get(i);
//						MFI_C_PaymentLine line = new MFI_C_PaymentLine(getCtx(), 0,
//								null);
//						line.setC_Payment_ID(payment.get_ID());
//						line.setC_BPartner_ID(l.getC_BPartner_ID());
//						line.setAmount(l.getAmount());
//						line.save();
//					}
//
//					list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//							payment.get_ID());
//
//					// ПРОВОДИМ
//
//					for (int i = 0; i < list.size(); i++) {
//						Integer bp = list.get(i).getC_BPartner_ID();
//						BigDecimal amount = list.get(i).getAmount().negate();
//
//						FactLine fl = null;
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_InterCheckOff, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(), null,
//								amount);
//
//						setC_BPartner_ID(bp);
//						acct = getAccount(Doc.ACCTTYPE_HRMGo, as);
//						fl = fact.createLine(null, acct, getC_Currency_ID(),
//								amount, null);
//
//					}
//
//				}
//			
//			
//		} // ОСТАЛЬНЫЕ ТИПЫ ДОКУМЕНТОВ РАСКИДАЕМ ПОЗЖЕ
//		//уже 30,05,2013 и где раскидка...незнаю, надеюсь это когда нибудь случиться и жить станет лечге
//		else {
//
//			boolean fix = false;
//			boolean isTrip = false;
//			String doctype = null;
//			// String DocumentType = getDocumentType();
//			BigDecimal hrm_statement_id;
//			//для тех кто не делает обновление модели, мало что сдвинеться...
//			String zsql = " SELECT "
//					+ "	d.docbasetype, p.c_order_id, p.c_invoice_id, b.isemployee, "
//					+ "	p.isprepayment, p.fi_typeoftax_id, c_charge_id, p.fi_businesstrip_id, "
//					+ "	d.name, p.docstatus, p.reversal_id, hrm_statement_id "
//					+ " FROM c_payment p "
//					+ " inner join c_doctype d on d.c_doctype_id = p.c_doctype_id "
//					+ " inner join c_bpartner b on b.c_bpartner_id = p.c_bpartner_id  "
//					+ " where p.c_payment_id = ? ";
//			pstmt = null;
//			rsDT = null;
//			try {
//				pstmt = DB.prepareStatement(zsql, null);
//				int p = get_ID();
//				pstmt.setInt(1, get_ID());
//				rsDT = pstmt.executeQuery();
//				if (rsDT.next()) {
//					doctype = rsDT.getString(1);
//
//					String isemployee = rsDT.getString(4);
//					String isPrePayment = rsDT.getString(5);
//					BigDecimal fi_businesstrip_id = rsDT.getBigDecimal(8);
//
//					BigDecimal fi_typeoftax_id = rsDT.getBigDecimal(6);
//
//					hrm_statement_id = rsDT.getBigDecimal(12);
//
////					if (doctype.equals("APS"))
//
//						// 1
//						// --------------------------------------------------------------------------------------------------------------
//						if (hrm_statement_id != null
//								&& (hrm_statement_id
//										.compareTo(new BigDecimal(0)) == 1)) {
//
//							Mhrmstatement statement = new Mhrmstatement(
//									getCtx(), hrm_statement_id.intValue(),
//									getTrxName());
//							String type = statement.gethrm_typeOperation();
//							if (type.equals(X_hrm_statement.HRM_TYPEOPERATION_VACATION)
//									|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_SALARY)
//									|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_OPV)
//									|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_IPN)
//									|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_COTCH)
//									|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_CNALOG)) {
//
//								List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//										.getMFI_C_PaymentLines(log, getCtx(),
//												get_ID());
//
//								Integer BPHeader = getC_BPartner_ID();
//
//								for (int i = 0; i < list.size(); i++) {
//
//									isTrip = true;
//									Integer bp = list.get(i).getC_BPartner_ID();
//									BigDecimal amount = list.get(i).getAmount();
//
//									if (type.equals(X_hrm_statement.HRM_TYPEOPERATION_VACATION)
//											|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_SALARY))
//										acct = getAccount(
//												Doc.ACCTTYPE_HRMSalary, as); // 3350
//									else if (type
//											.equals(X_hrm_statement.HRM_TYPEOPERATION_COTCH))
//										acct = getAccount(
//												Doc.ACCTTYPE_HRMCOTCH, as); // 3210
//									else if (type
//											.equals(X_hrm_statement.HRM_TYPEOPERATION_CNALOG))
//										acct = getAccount(
//												Doc.ACCTTYPE_HRMCNALOG, as); // 3150
//									else if (type
//											.equals(X_hrm_statement.HRM_TYPEOPERATION_OPV))
//										acct = getAccount(Doc.ACCTTYPE_HRMOPV,
//												as); // 3220
//									else if (type
//											.equals(X_hrm_statement.HRM_TYPEOPERATION_IPN))
//										acct = getAccount(Doc.ACCTTYPE_HRMIPN,
//												as); // 3120
//
//									setC_BPartner_ID(bp);
//									fact.createLine(null, acct,
//											getC_Currency_ID(), amount, null);
//
//									if (type.equals(X_hrm_statement.HRM_TYPEOPERATION_VACATION)
//											|| type.equals(X_hrm_statement.HRM_TYPEOPERATION_SALARY))
//										acct = getAccount(Doc.ACCTTYPE_HRMGo,
//												as); // 103001
//									else
//										acct = getAccount(
//												Doc.ACCTTYPE_BankInTransit, as);
//
//									setC_BPartner_ID(BPHeader);
//									fact.createLine(null, acct,
//											getC_Currency_ID(), null, amount);
//
//								}
//							}
//						}
//							// 2
//							// --------------------------------------------------------------------------------------------------------------						 
//						else if (fi_typeoftax_id != null
//								&& (fi_typeoftax_id
//										.compareTo(new BigDecimal(0)) == 1)) {
//							setFI_TypeOfTax_ID(fi_typeoftax_id);
//							
//							if (DocStatus.equals("RE")) {
//								List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//										.getMFI_C_PaymentLines(log, getCtx(), payment.get_ID());
//								if (list != null) {
//									for (int i = 0; i < list.size(); i++) {
//										MFI_C_PaymentLine l = list.get(i);
//										l.deleteEx(true);
//
//									}
//								}
//
//								// КОПИРУЕМ С ПЕРВИЧНОГО ДОКУМЕНТА
//
//								list = MFI_C_PaymentLine.getMFI_C_PaymentLines(log, getCtx(),
//										payment.getReversal_ID());
//								for (int i = 0; i < list.size(); i++) {
//									MFI_C_PaymentLine l = list.get(i);
//									MFI_C_PaymentLine line = new MFI_C_PaymentLine(getCtx(), 0,
//											null);
//									line.setC_Payment_ID(payment.get_ID());
//									line.setC_BPartner_ID(l.getC_BPartner_ID());
//									line.setAmount(l.getAmount().negate());
//									line.save();
//								}
//
//							}
//							
//							List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//									.getMFI_C_PaymentLines(log, getCtx(),
//											payment.get_ID());
//							
//							if (list.size() > 0){
//								
//								Integer BPHeader = getC_BPartner_ID();
//								
//								if (doctype.equals("ARR")){
//									
//									for (int i = 0; i < list.size(); i++) {
//	
//										Integer bp = list.get(i).getC_BPartner_ID();
//										BigDecimal amount = list.get(i).getAmount();
//	
//										FactLine fl = null;
//	
//										// setC_BPartner_ID(BPHeader);
//										setC_BPartner_ID(bp);
//										acct = getAccount(
//												Doc.ACCTTYPE_BankInTransit, as);
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(), amount, null);
//	
//										setC_BPartner_ID(bp);
//										if (fi_typeoftax_id
//												.compareTo(new BigDecimal(1000040)) == 0)
//											acct = getAccount(Doc.ACCTTYPE_HRMOPV,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_HRMCOTCH, as);
//										// acct =
//										// getAccount(Doc.ACCTTYPE_E_Liability, as);
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(), null, amount);
//									}	
//									isTrip = true;									
//								}else if(doctype.equals("APP")){							
//								
//									for (int i = 0; i < list.size(); i++) {
//	
//										Integer bp = list.get(i).getC_BPartner_ID();
//										BigDecimal amount = list.get(i).getAmount();
//	
//										FactLine fl = null;
//	
//										// setC_BPartner_ID(BPHeader);
//										setC_BPartner_ID(bp);
//										acct = getAccount(
//												Doc.ACCTTYPE_BankInTransit, as);
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(), null, amount);
//	
//										setC_BPartner_ID(bp);
//										if (fi_typeoftax_id
//												.compareTo(new BigDecimal(1000040)) == 0)
//											acct = getAccount(Doc.ACCTTYPE_HRMOPV,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_HRMCOTCH, as);
//										// acct =
//										// getAccount(Doc.ACCTTYPE_E_Liability, as);
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(), amount, null);
//	
//									}	
//									isTrip = true;									
//								}else{	
//									acct = getAccount(Doc.ACCTTYPE_PaymentTax, as);
//								}
//							}
//							else 
//								acct = getAccount(Doc.ACCTTYPE_PaymentTax, as);
//						} else {
//							// 3
//							// --------------------------------------------------------------------------------------------------------------
//							if (isemployee.equals("Y")) {
//								// if (isPrePayment.equals("Y"))
//								// acct = getAccount(Doc.ACCTTYPE_C_Prepayment,
//								// as);
//								// else
//								acct = getAccount(Doc.ACCTTYPE_Employee, as);
//							} else {
//								// 4
//								// --------------------------------------------------------------------------------------------------------------
//								String typedoc = rsDT.getString(1);
//								int c_order_id = rsDT.getInt(2);
//								int c_invoice_id = rsDT.getInt(3);
//								int c_charge_id = rsDT.getInt(7);
//								String DocumentNo = rsDT.getString(9);
//
//								if ((!typedoc.equals("") || typedoc != null)
//										&& typedoc.equals("APP")) {
//
//									// String DocStatus = rsDT.getString(10);
//
//									if (DocStatus.equals("RE")) {
//										int reversal_id = rsDT.getInt(11);
//										List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//												.getMFI_C_PaymentLines(log,
//														getCtx(), reversal_id);
//										for (int i = 0; i < list.size(); i++) {
//											MFI_C_PaymentLine l = list.get(i);
//											MFI_C_PaymentLine line = new MFI_C_PaymentLine(
//													getCtx(), 0, null);
//											line.setC_Payment_ID(get_ID());
//											line.setC_BPartner_ID(l
//													.getC_BPartner_ID());
//											line.setAmount(l.getAmount());
//											line.save();
//										}
//
//									}
//
//									List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//											.getMFI_C_PaymentLines(log,
//													getCtx(), get_ID());
//
//									// if(DocumentNo.equals("AP Payment (Salary)"))
//									// acct =
//									// getAccount(Doc.ACCTTYPE_EmployeeSalary,
//									// as);
//									// else
//									if (fi_businesstrip_id != null
//											&& (fi_businesstrip_id
//													.compareTo(new BigDecimal(0)) == 1)
//											|| list.size() > 0) {
//
//										Integer BPHeader = getC_BPartner_ID();
//
//										for (int i = 0; i < list.size(); i++) {
//
//											Integer bp = list.get(i)
//													.getC_BPartner_ID();
//											BigDecimal amount = list.get(i)
//													.getAmount();
//
//											FactLine fl = null;
//											if (DocStatus.equals("RE")) {
//												setC_BPartner_ID(BPHeader);
//												acct = getAccount(
//														Doc.ACCTTYPE_BankInTransit,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														null, amount.negate());
//
//												setC_BPartner_ID(bp);
//												acct = getAccount(
//														Doc.ACCTTYPE_E_Liability,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														amount.negate(), null);
//
//											} else {
//												// setC_BPartner_ID(BPHeader);
//												setC_BPartner_ID(bp);
//												acct = getAccount(
//														Doc.ACCTTYPE_BankInTransit,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														null, amount);
//
//												setC_BPartner_ID(bp);
//												acct = getAccount(
//														Doc.ACCTTYPE_HRMSalary,
//														as);
//												// acct =
//												// getAccount(Doc.ACCTTYPE_E_Liability,
//												// as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														amount, null);
//											}
//											isTrip = true;
//
//										}
//									} else if (c_order_id != 0)
//										if (isPrePayment.equals("Y"))
//											acct = getAccount(
//													Doc.ACCTTYPE_V_Prepayment,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_PaymentSelect2,
//													as);
//									else if (c_charge_id != 0)
//										if (isPrePayment.equals("Y"))
//											acct = getAccount(
//													Doc.ACCTTYPE_V_Prepayment,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_ChargeAPP, as);
//									else if (isPrePayment.equals("Y"))
//										acct = getAccount(
//												Doc.ACCTTYPE_V_Prepayment, as);
//									else
//										acct = getAccount(
//												Doc.ACCTTYPE_V_Liability, as);
//
//									// 5
//									// --------------------------------------------------------------------------------------------------------------
//
//								} else if ((!typedoc.equals("") || typedoc != null)
//										&& typedoc.equals("ARR")) {
//
//									// String DocStatus = rsDT.getString(10);
//
//									if (DocStatus.equals("RE")) {
//										// delete exists rows excep. dublicates
//										int id = get_ID();
//										if (id > 0) {
//											List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//													.getMFI_C_PaymentLines(log,
//															getCtx(), id);
//											if (list != null) {
//												for (int i = 0; i < list.size(); i++) {
//													MFI_C_PaymentLine l = list
//															.get(i);
//													l.deleteEx(true);
//
//												}
//											}
//										}
//										// add rows from mamy rows
//										int reversal_id = rsDT.getInt(11);
//										if (reversal_id > 0) {
//											List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//													.getMFI_C_PaymentLines(log,
//															getCtx(),
//															reversal_id);
//											if (list != null) {
//												for (int i = 0; i < list.size(); i++) {
//													MFI_C_PaymentLine l = list
//															.get(i);
//													MFI_C_PaymentLine line = new MFI_C_PaymentLine(
//															getCtx(), 0, null);
//													line.setC_Payment_ID(get_ID());
//													line.setC_BPartner_ID(l
//															.getC_BPartner_ID());
//													line.setAmount(l
//															.getAmount());
//													line.save();
//												}
//											}
//										}
//									}
//
//									List<MFI_C_PaymentLine> list = MFI_C_PaymentLine
//											.getMFI_C_PaymentLines(log,
//													getCtx(), get_ID());
//
//									if (fi_businesstrip_id != null
//											&& (fi_businesstrip_id
//													.compareTo(new BigDecimal(0)) == 1)
//											|| list.size() > 0) {
//
//										Integer BPHeader = getC_BPartner_ID();
//
//										for (int i = 0; i < list.size(); i++) {
//
//											Integer bp = list.get(i)
//													.getC_BPartner_ID();
//											BigDecimal amount = list.get(i)
//													.getAmount();
//
//											FactLine fl = null;
//											if (DocStatus.equals("RE")) {
//												setC_BPartner_ID(bp);
//												acct = getAccount(
//														Doc.ACCTTYPE_E_Liability,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														amount, null);
//
//												setC_BPartner_ID(BPHeader);
//												acct = getAccount(
//														Doc.ACCTTYPE_BankInTransit,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														null, amount);
//											} else {
//												acct = getAccount(
//														Doc.ACCTTYPE_E_Liability,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														null, amount);
//
//												setC_BPartner_ID(BPHeader);
//												acct = getAccount(
//														Doc.ACCTTYPE_BankInTransit,
//														as);
//												fl = fact.createLine(null,
//														acct,
//														getC_Currency_ID(),
//														amount, null);
//											}
//											isTrip = true;
//
//										}
//
//									}
//									if (!isTrip && DocStatus.equals("RE")) {
//										FactLine fl = null;
//										acct = getAccount(
//												Doc.ACCTTYPE_BankInTransit, as);
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(),
//												getAmount(), null);
//
//										if (isPrePayment.equals("Y"))
//											acct = getAccount(
//													Doc.ACCTTYPE_C_Prepayment, as);	
////										else
////											acct = getAccount(
////												Doc.ACCTTYPE_E_Liability, as);
//										else if (c_order_id != 0)
//												if (isPrePayment.equals("Y"))
//													acct = getAccount(
//															Doc.ACCTTYPE_C_Prepayment,
//															as);
//												else
//													acct = getAccount(
//															Doc.ACCTTYPE_CustomerContract,
//															as);
//											else if (c_charge_id != 0)
//												if (isPrePayment.equals("Y"))
//													acct = getAccount(
//															Doc.ACCTTYPE_V_Prepayment,
//															as);
//												else
//													acct = getAccount(
//															Doc.ACCTTYPE_ChargeARR, as);
//											else if (isPrePayment.equals("Y"))
//												acct = getAccount(
//														Doc.ACCTTYPE_C_Prepayment, as);
//											else
//												acct = getAccount(
//														Doc.ACCTTYPE_C_Receivable, as);											
//										
//										fl = fact.createLine(null, acct,
//												getC_Currency_ID(), null,
//												getAmount());
//										isTrip = true;
//									} else if (DocumentNo
//											.equals("AR Receipt (Salary)"))
//										acct = getAccount(
//												Doc.ACCTTYPE_EmployeeSalary, as);
//
//									else if (c_order_id != 0)
//										if (isPrePayment.equals("Y"))
//											acct = getAccount(
//													Doc.ACCTTYPE_C_Prepayment,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_CustomerContract,
//													as);
//									else if (c_charge_id != 0)
//										if (isPrePayment.equals("Y"))
//											acct = getAccount(
//													Doc.ACCTTYPE_V_Prepayment,
//													as);
//										else
//											acct = getAccount(
//													Doc.ACCTTYPE_ChargeARR, as);
//									else if (isPrePayment.equals("Y"))
//										acct = getAccount(
//												Doc.ACCTTYPE_C_Prepayment, as);
//									else
//										acct = getAccount(
//												Doc.ACCTTYPE_C_Receivable, as);
//									// acct =
//									// getAccount(Doc.ACCTTYPE_CustomerInvoice,
//									// as);
//
//								} else
//									fix = true;
//							}
//						}
//				} else
//					fix = true;
//
//			} catch (SQLException e) {
//				log.log(Level.SEVERE, zsql, e);
//			} finally {
//				DB.close(rsDT, pstmt);
//				rsDT = null;
//				pstmt = null;
//			}
//
//			if (!fix && !isTrip) {
//				if (doctype.equals("APP")) {
//					FactLine fl = fact.createLine(null, acct,
//							getC_Currency_ID(), getAmount(), null);
//					fl = fact.createLine(null,
//							getAccount(Doc.ACCTTYPE_BankInTransit, as),
//							getC_Currency_ID(), null, getAmount());
//				} else {
//					FactLine fl = fact.createLine(null,
//							getAccount(Doc.ACCTTYPE_BankInTransit, as),
//							getC_Currency_ID(), getAmount(), null);
//					fl = fact.createLine(null, acct, getC_Currency_ID(), null,
//							getAmount());
//
//				}
//			}
//			// }--------------------------------------
//
//			if (fix && !isTrip) {
//				int AD_Org_ID = getBank_Org_ID(); // Bank Account Org
//				if (getDocumentType().equals(DOCTYPE_ARReceipt)) {
//					// Asset
//					FactLine fl = fact.createLine(null,
//							getAccount(Doc.ACCTTYPE_BankInTransit, as),
//							getC_Currency_ID(), getAmount(), null);
//					if (fl != null && AD_Org_ID != 0)
//						fl.setAD_Org_ID(AD_Org_ID);
//					//
//					acct = null;
//					if (getC_Charge_ID() != 0)
//						acct = MCharge.getAccount(getC_Charge_ID(), as,
//								getAmount());
//					else if (m_Prepayment)
//						acct = getAccount(Doc.ACCTTYPE_C_Prepayment, as);
//					else {
//						acct = getAccount(Doc.ACCTTYPE_UnallocatedCash, as);
//						StringBuffer sql = new StringBuffer(
//								"SELECT b.v_liability_acct FROM c_payment as a"
//										+ " LEFT JOIN erps_stati_bdds as b ON"
//										+ " (a.erps_stati_bdds_id = b.erps_stati_bdds_id)"
//										+ " WHERE c_payment_id = " + get_ID());
//						int no = DB.getSQLValue(getTrxName(), sql.toString());
//						log.fine(sql + " " + no);
//						System.out.println(sql + " " + no);
//						if (no > 0)
//							acct = MAccount.get(as.getCtx(), no);
//					}
//					fl = fact.createLine(null, acct, getC_Currency_ID(), null,
//							getAmount());
//					if (fl != null && AD_Org_ID != 0 && getC_Charge_ID() == 0) // don't
//																				// overwrite
//																				// charge
//						fl.setAD_Org_ID(AD_Org_ID);
//				}
//				// APP
//				else if (getDocumentType().equals(DOCTYPE_APPayment)) {
//					acct = null;
//					if (getC_Charge_ID() != 0)
//						acct = MCharge.getAccount(getC_Charge_ID(), as,
//								getAmount());
//					else if (m_Prepayment)
//						acct = getAccount(Doc.ACCTTYPE_V_Prepayment, as);
//					else {
//						acct = getAccount(Doc.ACCTTYPE_PaymentSelect, as);
//						StringBuffer sql = new StringBuffer(
//								"SELECT b.v_liability_acct FROM c_payment as a"
//										+ " LEFT JOIN erps_stati_bdds as b ON"
//										+ " (a.erps_stati_bdds_id = b.erps_stati_bdds_id)"
//										+ " WHERE c_payment_id = " + get_ID());
//						int no = DB.getSQLValue(getTrxName(), sql.toString());
//						log.fine(sql + " " + no);
//						System.out.println(sql + " " + no);
//						if (no > 0)
//							acct = MAccount.get(as.getCtx(), no);
//					}
//					FactLine fl = fact.createLine(null, acct,
//							getC_Currency_ID(), getAmount(), null);
//					if (fl != null && AD_Org_ID != 0 && getC_Charge_ID() == 0) // don't
//																				// overwrite
//																				// charge
//						fl.setAD_Org_ID(AD_Org_ID);
//
//					// Asset
//					fl = fact.createLine(null,
//							getAccount(Doc.ACCTTYPE_BankInTransit, as),
//							getC_Currency_ID(), null, getAmount());
//					if (fl != null && AD_Org_ID != 0)
//						fl.setAD_Org_ID(AD_Org_ID);
//				} else {
//					p_Error = "DocumentType unknown: " + getDocumentType();
//					log.log(Level.SEVERE, p_Error);
//					fact = null;
//				}
//			}
//		}
		
		//
		facts_.add(fact);
		return facts_;
	} // createFact

	/**
	 * Get AD_Org_ID from Bank Account
	 * 
	 * @return AD_Org_ID or 0
	 */
	private int getBank_Org_ID() {
		if (m_C_BankAccount_ID == 0)
			return 0;
		//
		MBankAccount ba = MBankAccount.get(getCtx(), m_C_BankAccount_ID);
		return ba.getAD_Org_ID();
	} // getBank_Org_ID

	private void setHRMLines(Properties ctx, int HRM_BusinessTrip_ID) {
		// get HRM_BusinessTripLine's-------------------------{
		String sql = "select hrm_businesstrip_line_id, c_bpartner_id, hrm_total "
				+ "	from adempiere.hrm_businesstrip_line "
				+ "	where hrm_businesstrip_id = ? "
				+ "	order by hrm_businesstrip_line_id";
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = DB.prepareStatement(sql, null);
			pstmt.setInt(1, HRM_BusinessTrip_ID);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				MFI_C_PaymentLine line = new MFI_C_PaymentLine(ctx, 0, null);
				line.setC_Payment_ID(get_ID());
				line.setC_BPartner_ID(rs.getInt(2));
				line.setAmount(rs.getBigDecimal(3).negate());
				line.save();
			}
		} catch (SQLException e) {
			log.log(Level.SEVERE, sql, e);

		} catch (Exception e) {
			log.log(Level.SEVERE, sql, e);
		} finally {
			DB.close(rs, pstmt);
			rs = null;
			pstmt = null;
		}

	}

} // Doc_Paymentt